{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第三十一讲：线性变换及对应矩阵\n",
    "\n",
    "如何判断一个操作是不是线性变换？线性变换需满足以下两个要求：\n",
    "\n",
    "$$\n",
    "T(v+w)=T(v)+T(w)\\\\\n",
    "T(cv)=cT(v)\n",
    "$$\n",
    "\n",
    "即变换$T$需要同时满足加法和数乘不变的性质。将两个性质合成一个式子为：$T(cv+dw)=cT(v)+dT(w)$\n",
    "\n",
    "\n",
    "\n",
    "例1，二维空间中的投影操作，$T: \\mathbb{R}^2\\to\\mathbb{R}^2$，它可以将某向量投影在一条特定直线上。检查一下投影操作，如果我们将向量长度翻倍，则其投影也翻倍；两向量相加后做投影与两向量做投影再相加结果一致。所以投影操作是线性变换。\n",
    "\n",
    "“坏”例1，二维空间的平移操作，即平面平移："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nR48euLq6AjB79mzCwsJ466236NOnDzVr1mT//v0cO3aMSpUqYWZmxsSJE7l+/TomJiaMHDmSVq1a\n4e/vz8mTJ7l58yaOjo7Y29vrcqxevZodO3ZgbGxM/fr1deu/XrlyBWdnZ27cuIGFhQXTpk0jKioK\nPz8/Bg4cyKZNmwAoWrQoQUFBAFStWpXOnTszbdo0Lly4gFarZdCgQXTr1o20tDS8vb35448/qFKl\nCgkJCdk+d3fv3mXgwIHExsbSsGFDJk2aREhICEePHmXu3LnAo7Pc4sWLM3DgwEzbnj59Gjs7O+Li\n4ujZsyceHh4opXJU61WrVgWgRYsWTJ06FSMjI5RSnD9/ngULFtC6dWu8vb2Jjo6mSJEifPnll9jY\n2BAcHMzhw4dJTEwkJiaGli1bMnnyZHx8fIiNjWX48OH4+fkxf/58IiMjSUxMpFy5cvj7+z9zis9m\nzZpRvXp1AMqXL0/ZsmW5devWK22+KJFne/bsUS4uLiojI0PduXNHtWjRQgUHB6vo6GjVsWNHlZiY\nqJRSaurUqWrWrFlKKaXMzMx022/fvl2NGzdOKaVUu3btVEBAgFJKqYMHDyobGxullFLjxo1TwcHB\n6sKFC8rBwUE9fPhQKaXU3Llz1eLFi7Nkateunbp+/bru36tXr1ZKKRUYGKhGjBihlFLKzs5O/fXX\nX0oppS5evKg6d+6cZT/Dhg1TBw8eVEopNW/ePLVixYpsMyxZskTdvHlTWVhYqNjYWKWUUl5eXios\nLEwFBwfrHl9gYKDy8PBQSimVmpqqevfurQ4ePKiOHTummjRpopKSknJ59IWh0HcdLFmyRMXGxqoW\nLVqoO3fuqIyMDNW/f3/dPh9LT09XrVq1Uvfu3VNKPaqD06dPq02bNqkZM2YopZR6+PChcnJyUseP\nH1ehoaHKwcFBpaenq+TkZGVjY6Nu376ty6KUUiNGjNDV2NWrV1XLli3VnTt3lJ+fn3J2ds5yrDQa\njWrevLnSaDRKq9WqKVOmqNjYWLV9+3bVrl07de/ePfXw4UPVunVrdfHiRXXs2DHdfvz8/JSfn1+W\nf8+ZM0etX79eKaXU/fv3Vffu3VVMTIxauXKl8vLyUkopdfnyZfXpp5+qqKioTHmOHTumGjZsqK5e\nvaqUUsrT01OtW7dOJScnKwsLC5WSkqKUUqpTp04qLi4u07Z+fn6qZ8+eKj09XcXHx6uGDRuq5OTk\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1041cc2e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import numpy as np\n",
    "\n",
    "\n",
    "fig = plt.figure()\n",
    "\n",
    "sp1 = plt.subplot(221)\n",
    "vectors_1 = np.array([[0,0,3,2],]) \n",
    "X_1, Y_1, U_1, V_1 = zip(*vectors_1)\n",
    "plt.axhline(y=0, c='black')\n",
    "plt.axvline(x=0, c='black')\n",
    "sp1.quiver(X_1, Y_1, U_1, V_1, angles='xy', scale_units='xy', scale=1)\n",
    "sp1.set_xlim(0, 10)\n",
    "sp1.set_ylim(0, 5)\n",
    "sp1.set_xlabel(\"before shifted\")\n",
    "\n",
    "sp2 = plt.subplot(222)\n",
    "vector_2 = np.array([[0,0,3,2],\n",
    "                     [3,2,2,0],\n",
    "                     [0,0,5,2],\n",
    "                     [0,0,10,4]]) \n",
    "X_2,Y_2,U_2,V_2 = zip(*vector_2)\n",
    "plt.axhline(y=0, c='black')\n",
    "plt.axvline(x=0, c='black')\n",
    "sp2.quiver(X_2, Y_2, U_2, V_2, angles='xy', scale_units='xy', scale=1)\n",
    "sp2.set_xlim(0, 10)\n",
    "sp2.set_ylim(0, 5)\n",
    "sp2.set_xlabel(\"shifted by horizontal 2 then double\")\n",
    "\n",
    "sp3 = plt.subplot(223)\n",
    "vectors_1 = np.array([[0,0,6,4],]) \n",
    "X_1, Y_1, U_1, V_1 = zip(*vectors_1)\n",
    "plt.axhline(y=0, c='black')\n",
    "plt.axvline(x=0, c='black')\n",
    "sp3.quiver(X_1, Y_1, U_1, V_1, angles='xy', scale_units='xy', scale=1)\n",
    "sp3.set_xlim(0, 10)\n",
    "sp3.set_ylim(0, 5)\n",
    "sp3.set_xlabel(\"double the vector\")\n",
    "\n",
    "sp4 = plt.subplot(224)\n",
    "vector_2 = np.array([[0,0,6,4],\n",
    "                     [6,4,2,0],\n",
    "                     [0,0,8,4]]) \n",
    "X_2,Y_2,U_2,V_2 = zip(*vector_2)\n",
    "plt.axhline(y=0, c='black')\n",
    "plt.axvline(x=0, c='black')\n",
    "sp4.quiver(X_2, Y_2, U_2, V_2, angles='xy', scale_units='xy', scale=1)\n",
    "sp4.set_xlim(0, 10)\n",
    "sp4.set_ylim(0, 5)\n",
    "sp4.set_xlabel(\"doubled vector shifted by horizontal 2\")\n",
    "\n",
    "plt.subplots_adjust(hspace=0.33)\n",
    "plt.draw()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "plt.close(fig)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "比如，上图中向量长度翻倍，再做平移，明显与向量平移后再翻倍的结果不一致。\n",
    "\n",
    "有时我们也可以用一个简单的特例判断线性变换，检查$T(0)\\stackrel{?}{=}0$。零向量平移后结果并不为零。\n",
    "\n",
    "所以平面平移操作并不是线性变换。\n",
    "\n",
    "“坏”例2，求模运算，$T(v)=\\|v\\|,\\ T:\\mathbb{R}^3\\to\\mathbb{R}^1$，这显然不是线性变换，比如如果我们将向量翻倍则其模翻倍，但如果我将向量翻倍取负，则其模依然翻倍。所以$T(-v)\\neq -T(v)$\n",
    "\n",
    "例2，旋转$45^\\circ$操作，$T:\\mathbb{R}^2\\to\\mathbb{R}^2$，也就是将平面内一个向量映射为平面内另一个向量。检查可知，如果向量翻倍，则旋转后同样翻倍；两个向量先旋转后相加，与这两个向量先相加后旋转得到的结果一样。\n",
    "\n",
    "所以从上面的例子我们知道，投影与旋转都是线性变换。\n",
    "\n",
    "例3，矩阵乘以向量，$T(v)=Av$，这也是一个（一系列）线性变换，不同的矩阵代表不同的线性变换。根据矩阵的运算法则有$A(v+w)=A(v)+A(w),\\ A(cv)=cAv$。比如取$A=\\begin{bmatrix}1&0\\\\0&-1\\end{bmatrix}$，作用于平面上的向量$v$，会导致$v$的$x$分量不变，而$y$分量取反，也就是图像沿$x$轴翻转。\n",
    "\n",
    "线性变换的核心，就是该变换使用的相应的矩阵。\n",
    "\n",
    "比如我们需要做一个线性变换，将一个三维向量降至二维，$T:\\mathbb{R}^3\\to\\mathbb{R}^2$，则在$T(v)=Av$中，$v\\in\\mathbb{R}^3,\\ T(v)\\in\\mathbb{R}^2$，所以$A$应当是一个$2\\times 3$矩阵。\n",
    "\n",
    "如果我们希望知道线性变换$T$对整个输入空间$\\mathbb{R}^n$的影响，我们可以找到空间的一组基$v_1,\\ v_2,\\ \\cdots,\\ v_n$，检查$T$对每一个基的影响$T(v_1),\\ T(v_2),\\ \\cdots,\\ T(v_n)$，由于输入空间中的任意向量都满足：\n",
    "\n",
    "$$v=c_1v_1+c_2v_2+\\cdots+c_nv_n\\tag{1}$$\n",
    "\n",
    "所以我们可以根据$T(v)$推出线性变换$T$对空间内任意向量的影响，得到：\n",
    "\n",
    "$$T(v)=c_1T(v_1)+c_2T(v_2)+\\cdots+c_nT(v_n)\\tag{2}$$\n",
    "\n",
    "现在我们需要考虑，如何把一个与坐标无关的线性变换变成一个与坐标有关的矩阵呢？\n",
    "\n",
    "在$1$式中，$c_1,c_2,\\cdots,c_n$就是向量$v$在基$v_1,v_2,\\cdots,v_n$上的坐标，比如分解向量$v=\\begin{bmatrix}3\\\\2\\\\4\\end{bmatrix}=3\\begin{bmatrix}1\\\\0\\\\0\\end{bmatrix}+2\\begin{bmatrix}0\\\\1\\\\0\\end{bmatrix}+4\\begin{bmatrix}0\\\\0\\\\1\\end{bmatrix}$，式子将向量$v$分解在一组标准正交基$\\begin{bmatrix}1\\\\0\\\\0\\end{bmatrix},\\begin{bmatrix}0\\\\1\\\\0\\end{bmatrix},\\begin{bmatrix}0\\\\0\\\\1\\end{bmatrix}$上。当然，我们也可以选用矩阵的特征向量作为基向量，基的选择是多种多样的。\n",
    "\n",
    "我们打算构造一个矩阵$A$用以表示线性变换$T:\\mathbb{R}^n\\to\\mathbb{R}^m$。我们需要两组基，一组用以表示输入向量，一组用以表示输出向量。令$v_1,v_2,\\cdots,v_n$为输入向量的基，这些向量来自$\\mathbb{R}^n$；$w_1,w_2,\\cdots,w_m$作为输出向量的基，这些向量来自$\\mathbb{R}^m$。\n",
    "\n",
    "我们用二维空间的投影矩阵作为例子："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nm6Qff/xBR44k6Z133tJvv/2mihUrq1mzB1S2bKQmTnxHR44k6T//2aEVK5bpgQei/vf8EB09mqTk\n5GS7fpbMjfZ2PXr01qFDCfroo5k6fvyYtmzZpNmzpysyspxd23AHI53JnB9MOwOAndq1e1gjRgyV\nxWJV9+69NGjQMzk+tm/f/rp27ZqmTInV1aspqlOnnqZN+0glSpS447GvvDJUs2ZN01tv/V2pqTdV\nr14Dvf/+DNtU9rvvvqepUyfq2WcHqGTJUnrmmRfUpk17SVLPnn00a9aHOnnyhN55Z1K+f5bbz3zO\nrFy5cpo06QPFxU3XsmVLVLp0aT333Evq1q1nvl/f1Yx+bDcnJmtub3uc6Ny5K+7YjFeJiAhjv9iJ\nfWafxo3rKiDApF27fvb0ULxKTr9np0+fUp8+3bR0abwqVKiYzTPtYzab1bp1c82YMTfPlamMzFN/\nl0Y/thsREZbjfTRfALCDs/rKH3/8ob17f5TJZFKZMsYJDG/grW03M8IXAOyQ2zStPTZtWqc5c+L0\n6KPdndKi/YXR225+Eb4AkE/lyt2lbdt2OuW1Hnusnx57rJ9TXssf+ELbzYzwBQAUiNVq1YYNa1Wh\nQiXVqlU7zysm7du3RzVr1s7ymejc+ErbzYzwBQAUiMlkUocO0TpyJEkbNqyT1WqV1WpV5cpVVLt2\nnTvCuGbN2oqP/5c6duyU62pZvtZ2M3M4fC0Wi0aNGqXExEQFBARozJgxuueee5w5NgCAlzCZTKpa\ntZqqVq1mu+3o0SPauHG9LYwrVqykOnXqKjg4WH37PqEvvvhcdevWV7Vq1e94PV9su5k5HL6bN2+W\nyWTS0qVLtXPnTk2dOlWzZs1y5tgAAF6scuUqqlz5z5W8boWxxZKxtGbVqtWUlJSo5OTLatDgL5J8\nu+1m5nD4tm/fXm3btpWUsSB48eLFnTYoAIDvuT2Mjx8/pv37f9ayZUvUv/8gVavR2KfbbmYFXmTj\njTfe0KZNmzRt2jS1aNEix8elp5sVFGTsxbhhfBs2bFD79u3zPKEDGapWrSpJSkpK8ug4gFt27dql\nkydP2r6vUKGC6tStp9Xbk/TZxgSlm61qd38lPdetnoqF+FbbzcwpK1xduHBBvXv31ldffWW7lNbt\nWJXoTqzWZL8lS+Zp/fpNmjlzjooVK+bp4RgeK1w5hr9N+9izv86fP59lURFfPrab2wpXDteHzz//\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x11932f160>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure()\n",
    "\n",
    "vectors_1 = np.array([[0, 0, 3, 2],\n",
    "                      [0, 0, -2, 3]]) \n",
    "X_1, Y_1, U_1, V_1 = zip(*vectors_1)\n",
    "plt.axis('equal')\n",
    "plt.axhline(y=0, c='black')\n",
    "plt.axvline(x=0, c='black')\n",
    "plt.quiver(X_1, Y_1, U_1, V_1, angles='xy', scale_units='xy', scale=1)\n",
    "plt.plot([-6, 12], [-4, 8])\n",
    "plt.annotate('$v_1=w_1$', xy=(1.5, 1), xytext=(10, -20), textcoords='offset points', size=14, arrowprops=dict(arrowstyle=\"->\"))\n",
    "plt.annotate('$v_2=w_2$', xy=(-1, 1.5), xytext=(-60, -20), textcoords='offset points', size=14, arrowprops=dict(arrowstyle=\"->\"))\n",
    "plt.annotate('project line', xy=(4.5, 3), xytext=(-90, 10), textcoords='offset points', size=14, arrowprops=dict(arrowstyle=\"->\"))\n",
    "\n",
    "ax = plt.gca()\n",
    "ax.set_xlim(-5, 5)\n",
    "ax.set_ylim(-4, 4)\n",
    "ax.set_xlabel(\"Project Example\")\n",
    "\n",
    "plt.draw()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "plt.close(fig)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从图中可以看到，设输入向量的基为$v_1,v_2$，$v_1$就在投影上，而$v_2$垂直于投影方向，输出向量的基为$w_1,w_2$，而$v_1=w_1,v_2=w_2$。那么如果输入向量为$v=c_1v_1+c_2v_2$，则输出向量为$T(v)=c_1v_1$，也就是线性变换去掉了法线方向的分量，输入坐标为$(c_1,c_2)$，输出坐标变为$(c_1,0)$。\n",
    "\n",
    "找出这个矩阵并不困难，$Av=w$，则有$\\begin{bmatrix}1&0\\\\0&0\\end{bmatrix}\\begin{bmatrix}c_1\\\\c_2\\end{bmatrix}=\\begin{bmatrix}c_1\\\\0\\end{bmatrix}$。\n",
    "\n",
    "本例中我们选取的基极为特殊，一个沿投影方向，另一个沿投影法线方向，其实这两个向量都是投影矩阵的特征向量，所以我们得到的线性变换矩阵是一个对角矩阵，这是一组很好的基。\n",
    "\n",
    "所以，如果我们选取投影矩阵的特征向量作为基，则得到的线性变换矩阵将是一个包含投影矩阵特征值的对角矩阵。\n",
    "\n",
    "继续这个例子，我们不再选取特征向量作为基，而使用标准基$v_1=\\begin{bmatrix}1\\\\0\\end{bmatrix},v_2=\\begin{bmatrix}0\\\\1\\end{bmatrix}$，我们继续使用相同的基作为输出空间的基，即$v_1=w_1,v_2=w_2$。此时投影矩阵为$P=\\frac{aa^T}{a^Ta}=\\begin{bmatrix}\\frac{1}{2}&\\frac{1}{2}\\\\\\frac{1}{2}&\\frac{1}{2}\\end{bmatrix}$，这个矩阵明显没有上一个矩阵“好”，不过这个矩阵也是一个不错的对称矩阵。\n",
    "\n",
    "总结通用的计算线性变换矩阵$A$的方法：\n",
    "\n",
    "* 确定输入空间的基$v_1,v_2,\\cdots,v_n$，确定输出空间的基$w_1,w_2,\\cdots,w_m$；\n",
    "* 计算$T(v_1)=a_{11}w_1+a_{21}w_2+\\cdots+a_{m1}w_m$，求出的系数$a_{i1}$就是矩阵$A$的第一列；\n",
    "* 继续计算$T(v_2)=a_{12}w_1+a_{22}w_2+\\cdots+a_{m2}w_m$，求出的系数$a_{i2}$就是矩阵$A$的第二列；\n",
    "* 以此类推计算剩余向量直到$v_n$；\n",
    "* 最终得到矩阵$A=\\left[\\begin{array}{c|c|c|c}a_{11}&a_{12}&\\cdots&a_{1n}\\\\a_{21}&a_{22}&\\cdots&a_{2n}\\\\\\vdots&\\vdots&\\ddots&\\vdots\\\\a_{m1}&a_{m2}&\\cdots&a_{mn}\\\\\\end{array}\\right]$。\n",
    "\n",
    "最后我们介绍一种不一样的线性变换，$T=\\frac{\\mathrm{d}}{\\mathrm{d}x}$：\n",
    "\n",
    "* 设输入为$c_1+c_2x+c_3x^3$，基为$1,x,x^2$；\n",
    "* 则输出为导数：$c_2+2c_3x$，基为$1,x$；\n",
    "\n",
    "    所以我们需要求一个从三维输入空间到二维输出空间的线性变换，目的是求导。求导运算其实是线性变换，因此我们只要知道少量函数的求导法则（如$\\sin x, \\cos x, e^x$），就能求出它们的线性组合的导数。\n",
    "    \n",
    "    有$A\\begin{bmatrix}c_1\\\\c_2\\\\c_3\\end{bmatrix}=\\begin{bmatrix}c_2\\\\2c_3\\end{bmatrix}$，从输入输出的空间维数可知，$A$是一个$2\\times 3$矩阵，$A=\\begin{bmatrix}0&1&0\\\\0&0&2\\end{bmatrix}$。\n",
    "    \n",
    "最后，矩阵的逆相当于对应线性变换的逆运算，矩阵的乘积相当于线性变换的乘积，实际上矩阵乘法也源于线性变换。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
